Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

2K
Visualizações
¿Cómo reparar la advertencia de Visual Studio 2022 CA1416 "Sitio de llamadas accesible para todas las plataformas" pero "solo compatible con: 'ventanas'"?

Así que tengo un proyecto de biblioteca de clase ac # que solo pretendo usar en Windows. Contiene algunas clases que usan la clase System.Drawing.Image que solo está disponible en Windows. Después de actualizar a VS2022 y configurar el marco de destino en .NET 6.0, veo un montón de advertencias que dicen CA1416 "Este sitio de llamada es accesible en todas las plataformas. 'Alguna clase. Algún método' solo se admite en: 'ventanas'. Ver captura de pantalla abajo para algunos ejemplos:

ingrese la descripción de la imagen aquí

En cierto sentido, es genial que VS2022 haya escaneado la biblioteca y encontrado todo el código específico de la plataforma que estoy usando en la biblioteca. Pero me gustaría decirle a VS que solo planeo usar la biblioteca en Windows y que puede silenciar todas esas advertencias.

Primero verifiqué las opciones de la plataforma de destino en las propiedades del proyecto, pero no vi ningún objetivo específico de Windows.

ingrese la descripción de la imagen aquí

Entonces decidí editar el .csproj del proyecto directamente y cambié el marco de destino de

<TargetFramework>net6.0</TargetFramework>
para
<TargetFramework>net6.0-windows</TargetFramework>

Pero lamentablemente, incluso después de una recompilación, eso tampoco hizo que las advertencias desaparecieran. Entonces, leí un poco sobre las advertencias de CA1416 y, efectivamente, dice en Microsoft Docs que se ignora el TFM para evaluar esta advertencia; sin embargo, VS agrega un atributo al proyecto basado en el TFM que influye en esta advertencia, pero solo lo hace entonces, si el proyecto está configurado para generar el archivo AssemblyInfo.cs sobre la marcha. Pero, lamentablemente, el archivo AssemblyInfo.cs de mi proyecto se mantiene como un archivo real en lugar de generarlo automáticamente en el momento de la compilación.

Entonces, en este punto, estoy listo para patear la pelota y simplemente deshabilitar las advertencias CA1416 para mi proyecto. Entonces, en el archivo .proj del proyecto, agregué CA1416 para las compilaciones de lanzamiento y depuración de esta manera:

ingrese la descripción de la imagen aquí

Uno pensaría que ese sería el final de esas molestas advertencias. (suspiro) Resulta que, después de reconstruir el proyecto, las advertencias siguen apareciendo. ¿Tienes alguna sugerencia? Soy todo oídos.

over 4 years ago · Santiago Trujillo
6 Respostas
Responde à pergunta

0

Puede suprimir la advertencia con dotnet_diagnostic.CA1416.severity = none , pero imao, si solo tiene la intención de usarlo en Windows, debe configurar Target OS en Windows para el proyecto que corregirá la advertencia.

ingrese la descripción de la imagen aquí

https://docs.microsoft.com/en-us/dotnet/core/compatibility/code-analysis/5.0/ca1416-platform-compatibility-analyzer

Fuente:

https://stackoverflow.com/a/70272543/3850405

over 4 years ago · Santiago Trujillo Relatório

0

Similar a lo que hizo @RonC, pude resolver el problema agregando una regla a mi archivo .ruleset:

 <Rules AnalyzerId="Microsoft.Analyzers.ManagedCodeAnalysis" RuleNamespace="Microsoft.Rules.Managed"> <Rule Id="CA1416" Action="None"/> </Rules>

Solo tenga en cuenta que esto se aplicará a todo el proyecto para el que se utiliza el archivo de conjunto de reglas.

over 4 years ago · Santiago Trujillo Relatório

0

Una forma de resolver este problema es crear un .editorconfig para la solución y luego agregar la siguiente línea a ese archivo .editorconfig:

dotnet_diagnostic.CA1416.severity = none

Esto hará que todas las advertencias de "Validar compatibilidad de plataforma" desaparezcan.

over 4 years ago · Santiago Trujillo Relatório

0

Tuve éxito al eliminar las advertencias de CA1416 al agregar el siguiente decorador en la parte superior de la clase contenedora:

 [System.Runtime.Versioning.SupportedOSPlatform("windows")]

Solo estoy en VS2019 y uso .net 5, pero puede funcionar para usted. Intenté esto con el proyecto de consola VS2019 .net5 (programa de primera clase) y una biblioteca de clase .net5 (primera de la clase). Agregué el paquete nuget System.Common.Drawing. Mi código incluido:

 string inputPath = @"C:\mypath\mypng.png"; Image i = Image.FromFile(inputPath);
over 4 years ago · Santiago Trujillo Relatório

0

Hola, aunque este artículo aún no resuelve mi versión del problema: ejecutar selectivamente código específico de Windows en función de si estoy en Windows o no.

Al menos tengo la solución directa para su AssemblyInfo.cs:
Solo eche un vistazo a la versión generada automáticamente en <nombre de su proyecto>\obj\Debug\net6.0-windows\<nombre de su proyecto>.AssemblyInfo.cs

Utiliza exactamente el mismo atributo SupportedOSPlatform mencionado, junto con otro superior (todavía no sé su efecto exacto), de la siguiente manera:

 [assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] [assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")]

Por lo tanto, puede agregarlos a su propio archivo AssemblyInfo.cs personalizado si lo desea (aunque, por supuesto, en un código escrito manualmente, preferiría colocar el espacio de nombres System.Runtime.Version con una declaración de uso en la parte superior del archivo y lo haría también elimine el sufijo "Atributo" para acortar el nombre, y mi elección personal es omitir el "7.0" si no estoy 100% seguro de si mi código todavía funciona en Windows 7).

En mi opinión, este enfoque siempre es mejor que simplemente suprimir las advertencias. Porque de lo contrario, está eligiendo una solución alternativa en lugar de ofrecer una solución.

Sin embargo, una pequeña nota:
Todo este problema no tiene nada que ver con "Visual Studio 2022", sino con la forma en que funciona .NET y con el compilador de C# que da las advertencias.

about 4 years ago · jongeduard Relatório

0

Ah, también encontré la respuesta a mi propia pregunta ahora: código de ejecución selectiva.

 //using System.Runtime.InteropServices; if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { // Do some Windows-only stuff. }

Necesitaba esto debido a cierto código que no puedo usar en Linux (y tampoco parece que lo necesite).

Lo sorprendente aquí es que todo lo que se coloca dentro de esta condición ya no genera las advertencias del compilador CA1416.

Entonces, de alguna manera, claramente hicieron algunas cosas muy especiales del compilador de C# para que este código se reconociera correctamente de la manera que desea.

Actualización: resulta que el código anterior ya está un poco obsoleto, hay una forma más nueva a partir de .NET 5 que en realidad debería usar para ejecutar código de forma selectiva: System.OperatingSystem.Is OSName (). Aquí el ejemplo actualizado:

 //using System; if (OperatingSystem.IsWindows()) { // Do some Windows-only stuff. }

Por cierto, la historia de no recibir más advertencias, etc. es la misma.

Realmente quiero expresar que uno de los problemas más frustrantes de buscar cosas en Internet es que con demasiada frecuencia encuentras muchas respuestas muy antiguas en lugar de la actualizada que realmente necesitas.

Y para empeorar las cosas, los documentos de Microsoft que he encontrado no tienen nada claro sobre qué usar realmente (solo encuentro documentos de referencia de API, pero no documentos de tipo tutorial), o los documentos correctos son tan increíblemente difíciles de encontrar que No logré encontrarlos.

Son realmente ciertos comentarios en los problemas de los repositorios de github dotnet los que le brindan la sugerencia correcta sobre la forma correcta/mejor de hacer las cosas.

Recomiendo encarecidamente a cualquiera que encuentre esta página que haga su propia investigación, especialmente si está leyendo esto muchos años después. No me sorprendería que mi respuesta aquí también sea muy obsoleta muy rápidamente. 😒

about 4 years ago · jongeduard Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda